package com.servlet.utils;

import java.io.File;
import java.io.PrintStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Title: ProxyUtils
 * @Description:
 * @Auther: py
 * @Version: 1.0
 * @create 2023/11/28 11:22
 */
public class ProxyHelper {

    /**
     * @param o 被代理的对象  必须要有接口
     * @return
     */
    public static Object getProxyInstance(Object o) {
        // 获取被代理对象的类加载器
        ClassLoader classLoader = o.getClass().getClassLoader();
        // 获取被代理对象的接口
        Class<?>[] interfaces = o.getClass().getInterfaces();
        // 执行器
        InvocationHandler invocationHandler = (proxy, method, args) -> {
            Object invoke = null;
            try {
                // 开启事务功能
                //System.out.println("开启事务....");
                JDBCHelper.beginTransform();
                // 执行service的方法
                invoke = method.invoke(o, args);
                // 提交事务的功能
                JDBCHelper.commitTransform();

            } catch (Throwable e) {

//                PrintStream s = new PrintStream(ProxyHelper.class.getResource("/error.log").getPath());
//                e.printStackTrace(s);
                e.printStackTrace();
                System.out.println("产生了异常:" + e.toString());
                // 回滚事务的功能
                JDBCHelper.rollbackTransform();
                // System.out.println("回滚事务....");
            } finally {
                // 释放资源
                JDBCHelper.release();

            }

            return invoke;
        };

        Object proxyObj = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
        return proxyObj;

    }
}
